package Reflect.demo01;


import java.lang.reflect.Field;

/*
    通过字节码对象操作属性字段
 */
public class ReflectDemo02 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        Book book1=new Book(1,"lol");
        //得到类的字节码对象
        Class<?> aClass1=Class.forName("Reflect.Book");

        //1.通过字节码对象得到public修饰的字段对象，getField()只能获取到public修饰的字段
        Field field1=aClass1.getField("id");
        //通过字段对象得到指定对象的该字段值
        int id1=(int)field1.get(book1);
        System.out.println(id1);
        //通过字段对象修改指定对象的改字段值
        field1.set(book1,2);
        System.out.println(field1.get(book1));
        //通过字节码对象得到任意的字段对象，getDeclaredField()能够获取到任意字段
        //但是在访问private修饰的字段时要设置字段对象的setAccessible()为true
        Field field2=aClass1.getDeclaredField("name");
        //设置该字段对象在访问该字段时跳过访问控制符的检查
        field2.setAccessible(true);
        String name=(String)field2.get(book1);
        System.out.println(name);
        //通过字节码对象得到该类的所有public修饰的字段
        Field fields1[]=aClass1.getFields();
        for(Field field:fields1){
            System.out.println(field);
        }
        //通过字节码对象得到该类的所有字段
        Field fields2[]=aClass1.getDeclaredFields();
        for(Field field:fields2){
            System.out.println(field);
        }

    }
}
